package com.biz.primus.ms.payment.channel.allinpay.req;

import com.biz.primus.common.utils.JsonUtils;
import com.biz.primus.ms.payment.channel.allinpay.lang.AllInPayKeys;
import com.biz.primus.ms.payment.channel.allinpay.res.AllInPayRefundRespVo;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.Getter;
import lombok.Setter;
import org.springframework.web.client.RestTemplate;

import java.util.TreeMap;
import java.util.TreeSet;
import java.util.UUID;

@Getter
@Setter
public class AllInPayRefund extends AllInPayRequestBase {
    public static final String API_URL = "https://vsp.allinpay.com/apiweb/unitorder/refund";
    /**
     * 商户号	平台分配的商户号
     */
    private String cusid;
    /**
     * 应用ID	平台分配的APPID
     */
    private String appid;
    /**
     * 版本号	接口版本号
     */
    private String version;
    /**
     * 交易订单号
     */
    private String reqsn;
    /**
     * 随机字符串	随机生成的字符串
     */
    private String randomstr = UUID.randomUUID().toString();
    /**
     * 退款金额
     * 单位为分
     */
    private Integer trxamt;
    /**
     * 原交易订单号
     * 原交易的商户订单号
     */
    private String oldreqsn;
    /**
     * 原交易流水
     * 原交易的收银宝平台流水
     * <p>
     * oldreqsn和oldtrxid必填其一
     * 建议:商户如果同时拥有oldtrxid和oldreqsn,优先使用oldtrxid
     */
    private String oldtrxid;


    public AllInPayRefundRespVo execute(String sign) {
        TreeMap<String, Object> map = new TreeMap<>();
        map.put("cusid", cusid);
        map.put("appid", appid);
        map.put("version", version);
        map.put("trxamt", trxamt);
        map.put("reqsn", reqsn);
        map.put("oldreqsn", oldreqsn);
        map.put("oldtrxid", oldtrxid);
        map.put("randomstr", randomstr);
        map.put("sign", sign);
        RestTemplate restTemplate = getRestTemplate();
        String s = restTemplate.postForObject(getApiUrl(), map, String.class);
        return JsonUtils.json2Obj(s, AllInPayRefundRespVo.class);
    }

    @Override
    protected String getApiUrl() {
        return API_URL;
    }

    @Override
    public TreeSet<String> getSignParams() {
        return Sets.newTreeSet(Lists.newArrayList(
                AllInPayKeys.CUSID,
                AllInPayKeys.APPID,
                AllInPayKeys.VERSION,
                AllInPayKeys.TRXAMT,
                AllInPayKeys.REQSN,
                AllInPayKeys.OLDREQSN,
                AllInPayKeys.OLDTRXID,
                AllInPayKeys.RANDOMSTR

        ));
    }
}
